<?php

namespace Home\Controller;

use Think\Controller;

/**
 * 包裹状态变更通知第三方合作站点
 * @author cheng
 * @date 2017-06-16
 */
class PartnerController extends Controller {

    /**
     * 雅居乐请求地址
     * 测试地址：http://api.agileliving.com.cn/api.do
     * 正式地址：http://api.4006983383.com/api.do
     */
    private $YJL_REQ = array(
//        'url' => "http://api.agileliving.com.cn/api.do", // 测试地址
//        'app_id' => 'dbc0154a7c08ca3517805d1b54d49dfd', //应用的唯一标识（测试用）
//        'app_secret' => 'OlKAigBnez9fV7AShgCYr01CL0eV8vY1H76PWrrKf0pahE5kg2lgEPFMSxyHyVaA', //与 app_id相对应的一个64位字符串。用于接口请求时的签名干扰串。（测试用）
//        'f_partner_code' => "100002", // 第三方合作站点代码号，表tp_third_partner配置（测试用）
        
        'url' => "http://api.4006983383.com/api.do", // 正式地址
        'app_id' => '3892c430fc57002f8bcbf1877d0dd5a6', //应用的唯一标识（正式环境用）
        'app_secret' => 'Zg4fkkwwDNXXSeIFDIwP8CGqJY8S2HVbWnRDRhMIABbw6vqe8AU47pGstWlVCwnl', //与 app_id相对应的一个64位字符串。用于接口请求时的签名干扰串。（正式环境用）
        'f_partner_code' => "100001", // 第三方合作站点代码号，表tp_third_partner配置（正式环境用）
        
        'ver' => '1.0', //预留字段。请求的版本，固定写1.0
        'method' => 'life.panda.msgpush.sendMsg', //方法名
        'method_checkLogin' => 'life.login.checkLogin', //验证用户登录接口
        'accessToken' => '412f258650d7e0e2d891c08311952ed9b95b360be429f1c1374d080d05fe25cb',
        
    );

    /**
     * @desc 扫描队列表获取请求状态为0的进行请求
     * @author cheng 复制修改
     * @update 2017-06-16 15:00
     */
    public function queueScanning() {
        $curday = date('YmdHis');
        $times = date('YmdHis', strtotime('-1 hour'));
        //筛选条件
        $map_sto['sal.f_create_time'] = array('between', array($times, $curday));
        $map_sto['_string'] = '(sal.f_type=1 AND sal.f_partner_storage_status=0) OR (sal.f_type=2 AND sal.f_partner_arrive_status=0) OR (sal.f_type=3 AND sal.f_partner_rejection_status=0)';
        $parcelInfo = new \Home\Model\StationPartnerLogModel();
        $data = $parcelInfo->queryExpressPartnerData($map_sto);

        //print_r($data);exit;

        foreach ($data as $v) {
            //雅居乐
            if ($v['f_partner_code'] == $this->YJL_REQ['f_partner_code']) {
                $yjl_date[] = $v;
            }
        }
        if (!empty($yjl_date)) {
            $this->yjlStorage($yjl_date);
        }
    }

    /**
     * @desc 组织数据向雅居乐发送请求
     * @author cheng 复制修改
     * @update 2017-06-16
     */
    public function yjlStorage($arr) {
        //获取用户信息
        //$user_info = $this->getYjl_User_Info(); //测试用
        //循环处理数据
        foreach ($arr as $value) {
            if ($value['f_type'] == '1') {
                $title = '取件通知';
                if ($value['f_professional'] == 1) { //专业版
                    $code_msg = $value['f_num'];
                } else {
                    $code_msg = $value['f_take_code'];
                }
                $type_msg = '您的包裹（' . $value['f_com_name'] . '，' . $value['f_mail_no'] . '）已经到达站点：' . $value['f_address'] . '，提货码是' . $code_msg . '，悄悄告诉你哦，为了您与包裹尽快相见，请于72小时内完成取件吧~~';
                $project = 'f_partner_storage_status';
            } elseif ($value['f_type'] == '2') {
                $title = '取件成功通知';
                $type_msg = '您的包裹（' . $value['f_com_name'] . '，' . $value['f_mail_no'] . '）已经被取出啦，如果包裹有问题，可电话联系站点（' . $value['f_station_name'] . '）工作人员哦，电话：' . $value['f_tel'];
                $project = 'f_partner_arrive_status';
            } elseif ($value['f_type'] == '3') {
                $title = '包裹拒收通知';
                $type_msg = '您的包裹（' . $value['f_com_name'] . '，' . $value['f_mail_no'] . '）已经被拒绝签收，如非您本人操作，可电话联系站点（' . $value['f_station_name'] . '）工作人员哦，电话：' . $value['f_tel'];
                $project = 'f_partner_rejection_status';
            }
            $data = array(
                'mobile' => $value['f_recipient_mobile'], //$user_info['data']['mobile']
                'msg' => $type_msg,
                'title' => $title
            );
            ksort($data); //参数需要按照字母数字排序
            //转换成json数据，JSON_UNESCAPED_UNICODE汉字不进行转码，否则下面操作签名会"签名验证失败"
            $params = json_encode($data, JSON_UNESCAPED_UNICODE);
            //准备签名字 符串排序（参数需要按照字母数字排序,签名的数据是原始数据，不能对参数进行urlencode之后再签名）后为：
            $timestamp = time();
            $sign_str = $this->getSign($params, $timestamp, $this->YJL_REQ['method']);
            //拼接url,需要对params参数进行urlencode
            $url = $this->getUrl($params, $timestamp, $this->YJL_REQ['method'], $sign_str);
            //请求第三方站点接口
            $Return = use_CURL($url, FALSE); //get
            //$Return = use_CURL($url, True, $params); //post
            $Return_Data = json_decode($Return['content'], true);

            //dump($Return_Data);exit;

            if (empty($Return_Data)) {
                $where = array($project => '2', 'f_error' => '请求失败');
            }
            if ($Return_Data['code'] === 0) { //0=成功响应
                $where = array($project => '1');
            } else {
                $where = array($project => '2', 'f_error' => $Return_Data['msg_cn']);
            }
            $parcelInfo = new \Home\Model\StationPartnerLogModel();
            $parcelInfo->updateExpressData($value['f_parcel_id'], $where);
        }
    }

    /**
     * 获取雅居乐提供的uid和mobile
     * @author cheng
     */
    public function getYjl_User_Info() {
        $data = array(
            'accessToken' => $this->YJL_REQ['accessToken'],
        );
        ksort($data); //参数需要按照字母数字排序
        //转换成json数据，JSON_UNESCAPED_UNICODE汉字不进行转码，否则下面操作签名会"签名验证失败"
        $params = json_encode($data, JSON_UNESCAPED_UNICODE);
        //准备签名字 符串排序（参数需要按照字母数字排序,签名的数据是原始数据，不能对参数进行urlencode之后再签名）后为：
        $timestamp = time();
        $sign_str = $this->getSign($params, $timestamp, $this->YJL_REQ['method_checkLogin']);
        //拼接url,需要对params参数进行urlencode
        $url = $this->getUrl($params, $timestamp, $this->YJL_REQ['method_checkLogin'], $sign_str);
        //请求第三方站点接口
        $Return = use_CURL($url, FALSE); //get
        $Return_Data = json_decode($Return['content'], true);
        //dump($Return_Data);exit;
        return $Return_Data;
    }

    /**
     * 产生签名sign
     * @param type $data json数据，json里的参数需要按照字母数字排序
     * @param type $timestamp 时间戳
     * @param type $method 方法名
     */
    public function getSign($data, $timestamp, $method) {
        $ready_str = 'app_id=' . $this->YJL_REQ['app_id'] . '&method=' . $method .
                '&params=' . $data . '&timestamp=' . $timestamp . '&ver=' . $this->YJL_REQ['ver'] . $this->YJL_REQ['app_secret'];
        //产生签名sign
        $sign_str = md5($ready_str);
        return $sign_str;
    }

    /**
     * 产生拼接的url
     * @param type $data json数据，json里的参数需要按照字母数字排序
     * @param type $timestamp 时间戳
     * @param type $method 方法名
     * @param type $sign_str 签名sign
     */
    public function getUrl($data, $timestamp, $method, $sign_str) {
        $url = $this->YJL_REQ['url'] . '?ver=' . $this->YJL_REQ['ver'] . '&timestamp=' . $timestamp . '&method=' . $method .
                '&params=' . urlencode($data) . '&app_id=' . $this->YJL_REQ['app_id'] . '&sign=' . $sign_str;
        return $url;
    }

    /**
     * 提取XML中数据
     * @param string $XML_Content
     * @return array
     */
    private function XML_To_Array($XML_Content = '') {
        $xmlResult = xml_parser_create();
        xml_parse_into_struct($xmlResult, $XML_Content, $Array);
        xml_parser_free($xmlResult);

        $Data = Array();

        foreach ($Array as $val) {
            if (isset($val['value']) && $val['value'] != '') {
                $Data[$val['tag']] = $val['value'];
            }
        }

        return $Data;
    }

}
